#include "menu.h"

const std::string menu::items[] = {"Konyv felvetele","Konyv(ek) listazasa","Konyv(ek) keresese","Konyv torlese","Konyv kolcsonzese","Konyv visszahozatala","Tag felvetele","Tag(ok) listazasa","Tag modositasa","Tag kolcsonzeseinek listazasa","Tag torlese"};

template <class T>
bool menu::input(T& tmp)
{
    bool err;
    std::cin>>tmp;
    err=std::cin.fail();
    if (err)
    {
        std::cin.clear();
        while(std::cin.get()!= '\n');
    }
    if (std::cin.peek()!='\n'&&!err)
    {
        err=true;
        while(std::cin.get()!= '\n');
    }
    return err;
}

template <>
bool menu::input(std::string& tmp)
{
    bool err;
    std::getline(std::cin,tmp,'\n');
    err=tmp.find("|")!=std::string::npos||tmp.find("'")!=std::string::npos;
    err=tmp.size()>255;
    return err;
}

MenuResult menu::print()
{
    MenuResult result;
    result.params.clear();
    bool err=true;
    while (err)
    {
        int n=(int)sizeof(items)/(int)sizeof(items[0]);
        for (int i=0; i<n; ++i)
            std::cout<<i+1<<"."<<items[i]<<std::endl;
        std::cout<<n+1<<".Kilepes"<<std::endl;
        err=input(result.choice);
        err=err||result.choice-1>n||result.choice<1;
    }
    err=true;
    int id;
    std::string st;
    std::stringstream ss;
    switch (result.choice)
    {
    case 1:
//      1.Konyv felvetele
        std::getline(std::cin,st,'\n');
        while (err)
        {
            std::cout<<"Kerem a konyv szerzojet:";
            err=input(st);
        }
        result.params.push_back(st);
        err=true;
        while (err)
        {
            std::cout<<"Kerem a konyv cimet:";
            err=input(st);
        }
        result.params.push_back(st);
        err=true;
        while (err)
        {
            std::cout<<"Kerem a konyv kiadojat:";
            err=input(st);
        }
        result.params.push_back(st);
        err=true;
        while (err)
        {
            std::cout<<"Kerem a kiadas evet:";
            err=input(id);
            err=err||id<1900;
        }
        ss<<id;
        result.params.push_back(ss.str());
        err=true;
        while (err)
        {
            std::cout<<"Kerem a kiadas szamat:";
            err=input(id);
            err=err||id<1;
        }
        ss.str("");
        ss<<id;
        result.params.push_back(ss.str());
        err=true;
        while (err)
        {
            std::cout<<"Kerem a konyv ISBN szamat:";
            std::cin>>st;
            //ISBN helyessegenek ellenorzese
            if (st.size()==13)
            {
                int check=0;
                for (int i=0; i<12; ++i)
                    check+=(int)(st.at(i)-'0')*((i%2)*2+1);
                check%=10;
                check=10-check;
                if (check==(int)(st.at(12)-'0'))
                    err=false;
            }
        }
        result.params.push_back(st);
        break;
    case 3:
//      3.Konyv(ek) keresese
        std::getline(std::cin,st,'\n');
        while(err)
        {
            std::cout<<"Kerem a keresesi feltetelt:";
            err=input(st);
        }
        result.params.push_back(st);
        break;
    case 4:
//      4.Konyv torlese
        while (err)
        {
            std::cout<<"Kerem a konyv idjet:";
            err=input(id);
        }
        ss<<id;
        result.params.push_back(ss.str());
        break;
    case 5:
//      5.Konyv kolcsonzese
        int year,month,day;
        while (err)
        {
            std::cout<<"Kerem a konyv idjet:";
            err=input(id);
        }
        ss<<id;
        result.params.push_back(ss.str());
        err=true;
        while (err)
        {
            std::cout<<"Kerem a tag idjet:";
            err=input(id);
        }
        ss.str("");
        ss<<id;
        result.params.push_back(ss.str());
        err=true;
        while (err)
        {
            std::cout<<"Kerem a kolcsonzes kezdetenek az evet:";
            err=input(year);
            err=err||year<1900;
        }
        err=true;
        while (err)
        {
            std::cout<<"Kerem a kolcsonzes kezdetenek a honapjat:";
            err=input(month);
            err=err||month<1||month>12;
        }
        err=true;
        while (err)
        {
            std::cout<<"Kerem a kolcsonzes kezdetenek a napjat:";
            err=input(day);
            err=err||day<1;
            int days[]={31,28,31,30,31,30,31,31,30,31,30,31};
            err=err||day>days[month-1];
        }
        ss.str("");
        ss<<year<<"-"<<month<<"-"<<day;
        result.params.push_back(ss.str());
        break;
    case 6:
//      6.Konyv visszahozatala
        while (err)
        {
            std::cout<<"Kerem a konyv idjet:";
            err=input(id);
        }
        ss<<id;
        result.params.push_back(ss.str());
        break;
    case 7:
//      7.Tag felvetele
        while (err)
        {
            std::cout<<"Kerem a tag tipusat (1 - egyetemi polgar, 2 - egyetemi oktato, 3 - mas egyetem polgara, 4 - vendeg):";
            err=input(id);
            err=err||id<1||id>4;
        }
        ss<<id;
        result.params.push_back(ss.str());
        std::getline(std::cin,st,'\n');
        err=true;
        while (err)
        {
            std::cout<<"Kerem a tag nevet:";
            err=input(st);
        }
        result.params.push_back(st);
        err=true;
        while (err)
        {
            std::cout<<"Kerem a tag cimet:";
            err=input(st);
        }
        result.params.push_back(st);
        err=true;
        while (err)
        {
            std::cout<<"Kerem a tag elerhetoseget:";
            err=input(st);
        }
        result.params.push_back(st);
        break;
    case 9:
//      9.Tag modositasa
    case 10:
//      10.Tag kolcsonzeseinek listazasa
    case 11:
//      11.Tag torlese
        while (err)
        {
            std::cout<<"Kerem a tag idjet:";
            err=input(id);
        }
        ss<<id;
        result.params.push_back(ss.str());
        break;
    }
    return result;
}

